home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / update-openoffice-dicts < prev    next >
Text File  |  2009-05-15  |  9KB  |  263 lines

  1. #!/usr/bin/perl -w
  2.  
  3. # update-openoffice-dicts -- update OpenOffice.org's dictionary.lst
  4. #
  5. #   Copyright (C) 2003-2009 RenΘ Engelhard <rene@debian.org>,
  6. #   Copyright (C) 2003-2009 Agustin Martin Domingo <agmartin@debian.org>
  7. #
  8. # Public Domain
  9.  
  10. use Debian::DictionariesCommon q(dico_checkroot);
  11.  
  12. @print_comments=(
  13. "## ---------------------------------------------------------------------
  14. ##       List of All Dictionaries to be Loaded by OpenOffice.org
  15. ## ---------------------------------------------------------------------
  16. ##                   ********** WARNING **********
  17. ## ---------------------------------------------------------------------
  18. ##  This file is only needed for spellchecking under OpenOffice.org <3.
  19. ##  This file is not used at all by OpenOffice.org versions 3 and later.
  20. ##     It will be removed as soon as OpenOffice.org >=3 is installed,
  21. ##                   or no OpenOffice.org is present,
  22. ##                    or Debian squeeze is released,
  23. ##          or we decide that it should no longer be present,
  24. ##            along with *all* your personal settings in it.
  25. ## ---------------------------------------------------------------------
  26. ## Each Entry in the list have the following space delimited fields
  27. ##
  28. ## Field 1: Entry Type \"DICT\" - spellchecking dictionary
  29. ##                     \"HYPH\" - hyphenation dictionary
  30. ##                     \"THES\" - thesaurus files
  31. ##
  32. ## Field 2: Language code from Locale \"en\" or \"de\" or \"pt\" ...
  33. ##
  34. ## Field 3: Country Code from Locale \"US\" or \"GB\" or \"PT\"
  35. ##
  36. ## Field 4: Root name of file(s) \"en_US\" or \"hyph_de\" or \"th_en_US\"
  37. ##          (do not add extensions to the name)
  38. ##
  39. ## This file is automatically updated by update-openoffice-dicts script
  40. ## ---------------------------------------------------------------------
  41. ");
  42.  
  43. # -------------------------------------------------------------------------
  44. sub write_manually_added() {
  45. # -------------------------------------------------------------------------
  46. # put all entries not in the automatic section in the new dictionary.lst
  47. # file (manually added dictionaries by the user)
  48. # -------------------------------------------------------------------------
  49.   my $line;
  50.   my $inheader = 1;
  51.   open(DL_ORIG, "$dictionary_lst") # open the existing file for reading...
  52.     or die("Opening $dictionary_lst failed.\n");
  53.   while (<DL_ORIG>) {
  54.     chomp;
  55.     $line = $_;
  56.     undef $inheader if not m/^\#/;
  57.  
  58.     push @dictionary_orig,$line; # save original file
  59.  
  60.     if ($line eq $begin_string) {
  61.       # if we find the start of the section; set the flag that we are
  62.       # in the automatic section, ignore the following lines ...
  63.       $we_are_in_auto=1;
  64.       next;
  65.     } elsif ($line eq $end_string) {
  66.       # ... until we find the end and set the flag back.
  67.       $we_are_in_auto=0;
  68.       next;
  69.     } elsif ($we_are_in_auto == 0) {
  70.       # we are in non-automatic section; copy the user added entries
  71.       # into the temporary array; but that only if the line is not a ##
  72.       # comment or no blank line
  73.       next if $line =~ /^\#\#/;
  74.       next if $line =~/^\s*$/;
  75.       if ($inheader) {
  76.     next if $line =~ /^\#/;
  77.       }
  78.       push @dictionary_new, $line;
  79.     }
  80.   }
  81.   close(DL_ORIG);
  82. }
  83.  
  84. # -------------------------------------------------------------------------
  85. sub build_automatic_section() {
  86. # -------------------------------------------------------------------------
  87. # Read all files in $myspellinfos and $hunspellinfos and return their
  88. # contents verbatim for the new dictionary.lst, with $hunpellinfos prevailing
  89. # -------------------------------------------------------------------------
  90.   my $auto_text    = "";
  91.   my %auto_entries = ();
  92.   my @all_infos    = (<$myspellinfos/*>,<$hunspellinfos/*>);
  93.  
  94.   foreach $infofile ( @all_infos ) {
  95.     next if $infofile =~ m/.*~$/; # Skip backup copies
  96.     my @tmpinfo = ();
  97.     my $locale  = $infofile;
  98.     $locale     =~ s/^.*\///;
  99.     $locale     =~ s/^(hunspell|myspell)-//;
  100.     open(ENTRY,"$infofile");
  101.     while (<ENTRY>){              # Some info files might have no final
  102.       chomp;                    # newline.
  103.       push @tmpinfo, $_;        # This should uniformize everything.
  104.     }
  105.     close(ENTRY);
  106.     $auto_entries{$locale} = join("\n",@tmpinfo);
  107.   }
  108.  
  109.   $auto_text .= "$begin_string\n";
  110.   $auto_text .= "$str_instruct_add\n";
  111.   foreach ( sort keys %auto_entries ){
  112.     $auto_text .= $auto_entries{$_} . "\n";
  113.   }
  114.   $auto_text .= "$end_string\n\n";
  115.   return $auto_text;
  116. }
  117.  
  118. # -------------------------------------------------------------------------
  119. sub write_dictionary_lst() {
  120. # -------------------------------------------------------------------------
  121. # Write dictionary.lst, make backup of previous one if present and fix
  122. # file permissions. If in dryrun mode will only print result to stdout.
  123. # -------------------------------------------------------------------------
  124.   push @dictionary_new, @print_comments;
  125.   push @dictionary_new, &build_automatic_section();
  126.  
  127.   if ( -e $dictionary_lst ) {
  128.     $we_are_in_auto=0;
  129.     write_manually_added();
  130.   }
  131.  
  132.   if ( $dryrun ){
  133.     open(NEWFILE, "> /dev/stdout") # Write results to stdout.
  134.       or die("Opening STDOUT failed.\n");
  135.   } else {
  136.     open(NEWFILE, "> $dictionary_lst") # open the existing file for writing.
  137.       or die("Opening $dictionary_lst failed.\n");
  138.   }
  139.   foreach (@dictionary_new) { print NEWFILE $_, "\n"; }
  140.   close(NEWFILE);
  141.  
  142.   return if $dryrun;
  143.  
  144.   open(OLDFILE, "> $dictionary_lst.old") # open the backup file for writing
  145.     or die("Opening $dictionary_lst.old failed.\n");
  146.   foreach (@dictionary_orig) { print OLDFILE $_, "\n"; }
  147.   close(OLDFILE);
  148.  
  149.   # make sure the file has the right permissions
  150.   chown(0, 0, $dictionary_lst);
  151.   chmod(0644, $dictionary_lst);
  152. }
  153.  
  154. # -------------------------------------------------------------------------
  155. sub get_ooo_version (){
  156. # -------------------------------------------------------------------------
  157. # Check installed OOo version. If no OOOBaseVersion info is present, OOo is
  158. # ancient, so we set version to 0. Return nil if OOo is not installed or
  159. # version otherwise.
  160. # -------------------------------------------------------------------------
  161.   my $ooo_version_major;
  162.  
  163.   if ( -e "/usr/lib/openoffice/program/versionrc" ) {
  164.     open(VERSIONRC, "/usr/lib/openoffice/program/versionrc")
  165.       or die("Opening /usr/lib/openoffice/program/versionrc failed.\n");
  166.  
  167.     while (<VERSIONRC>) {
  168.       chomp;
  169.       if ( $_ =~ /^OOOBaseVersion=(\d)\.(\d)/ ) {
  170.     $ooo_version_major = $1;
  171.     last;
  172.       }
  173.     }
  174.     close(VERSIONRC);
  175.  
  176.     # If versionrc is present but no match is found OOo is ancient. Set version to 0.
  177.     $ooo_version_major = 0 unless $ooo_version_major;
  178.   }
  179.   return $ooo_version_major;
  180. }
  181.  
  182. # --------------------------------------------------------------------
  183. # The main program
  184. # --------------------------------------------------------------------
  185.  
  186. $dictionary_lst    = "/etc/openoffice/dictionary.lst";
  187. $myspellinfos      = "/usr/share/myspell/infos/ooo";
  188. $hunspellinfos     = "/usr/share/openoffice/infos";
  189. $begin_string      = "## !!! BEGIN AUTOMATIC SECTION -- DO NOT CHANGE !!!";
  190. $end_string        = "## !!! END AUTOMATIC SECTION -- DO NOT CHANGE !!!";
  191. $str_instruct_add  = "## !!! ADD YOUR ADDITIONAL ENTRIES BELOW THIS SECTION !!!";
  192. @dictionary_orig   = (); # The array with the original strings from dictionary.lst
  193. @dictionary_new    = (); # The array with the strings to go to new dictionary.lst
  194. $dryrun            = '';
  195. $ooo_version_major = get_ooo_version();
  196.  
  197. $dryrun = 1 if ( $ARGV[0] && $ARGV[0] =~ m/^(-d|--dryrun)$/ );
  198.  
  199. $dryrun or dico_checkroot();
  200.  
  201. if ($ooo_version_major && $ooo_version_major < 3) {
  202.   print STDOUT "Updating OpenOffice.org's dictionary list... ";
  203.  
  204.   # We may need to create the dir...
  205.   unless ( -d "/etc/openoffice" or $dryrun ) {
  206.     mkdir("/etc/openoffice",0755) || die "can't mkdir /etc/openoffice: $!\n";;
  207.   }
  208.  
  209.   write_dictionary_lst();
  210.  
  211.   print STDOUT "done.\n";
  212. } else {
  213.   if ( -e "$dictionary_lst" ) {
  214.     my $reason = $ooo_version_major ? "obsolete" : "useless";
  215.     print STDERR "Removing $reason /etc/openoffice/dictionary.lst file.\n";
  216.     unlink("$dictionary_lst");
  217.     unlink("$dictionary_lst.old");
  218.   }
  219. }
  220.  
  221. __END__
  222.  
  223. =head1 NAME
  224.  
  225. update-openoffice-dicts - rebuild dictionary.lst for OpenOffice.org
  226.  
  227. =head1 SYNOPSIS
  228.  
  229. update-openoffice-dicts
  230.  
  231. =head1 DESCRIPTION
  232.  
  233. update-openoffice-dicts can be used to regenerate dictionary.lst for
  234. openoffice.  This script is run by myspell dictionaries when they are
  235. installed or removed.
  236.  
  237. It is not normally necessary to run update-openoffice-dicts by hand.
  238. Packages containing dictionaries create a file in /usr/share/myspell/infos
  239. and call this script automatically.
  240.  
  241. update-openoffice-dicts will create a new dictionary.lst if it does not
  242. already exist.
  243.  
  244. =head1 FILES
  245.  
  246. /etc/openoffice/dictionary.lst, /usr/share/myspell/infos/ooo/*
  247.  
  248. =head1 SEE ALSO
  249.  
  250. openoffice(1), dictionary.lst(5)
  251.  
  252. =head1 AUTHORS
  253.  
  254. Rene Engelhard, Agustin Martin Domingo
  255.  
  256. =cut
  257.  
  258. # Local Variables:
  259. #  perl-indent-level: 2
  260. # End:
  261.  
  262. #  LocalWords:  openoffice myspell dicts
  263.